/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import BD.Conexion;
import BD.Tabla;
import java.sql.ResultSet;
import java.sql.SQLException;
import nivelPersistencia.PersistenciaException;
import objetosNegocio.MetodoPago;
import objetosNegocio.Residente;

/**
 *
 * @author Christian
 */
public class MetodosPagos extends Tabla {

    private String nombreTabla;
    private Mitad3Pagos m3p;
    private Credito4Pagos c4p;
    private Contado cnt;
    private Conexion c;

    public MetodosPagos(String nombreTabla, Conexion c) {
        super(nombreTabla);
        this.c = c;
        this.nombreTabla = nombreTabla;
        m3p = new Mitad3Pagos("mitad3pagos");
        m3p.setConexion(c.getConexion());
        c4p = new Credito4Pagos("cuatropagosiguales");
        c4p.setConexion(c.getConexion());
        cnt = new Contado("contado");
        cnt.setConexion(c.getConexion());
    }

    public int addMetodoPagoResidente(MetodoPago m) throws PersistenciaException {
        //System.out.println("Si ENTRO A PERSISTENCIA.");
        String s = "INSERT INTO " + nombreTabla + "(tipoMetodoPago, idResidente) VALUES('"
                + m.getTipoPago() + "', " + Integer.parseInt(m.getIdResidente().getIdResidente()) + ");";

        //System.out.println(s);
        super.actualiza(s);
        String s2 = "SELECT idMetodoPago FROM " + nombreTabla + " "
                + "WHERE idResidente = " + Integer.parseInt(m.getIdResidente().getIdResidente()) + ";";
        super.consulta(s2);
        ResultSet rs;
        int i = -1;
        while ((rs = obtenRenglon()) != null) {
            try {
                i = rs.getInt("idMetodoPago");
            } catch (SQLException ex) {
                throw new PersistenciaException("No se pudo obtener el ID del Metodo de Pago del Residente.", ex);
            }
        }
        //System.out.println("Valor i: " + i);
        if (i > 0) {
            //System.out.println("Si entro.  " + m.getTipoPago());
            if (m.getTipoPago().toLowerCase().equals("m3p")) {
                m3p.addMetodoTresPagos(i);
            }
            if (m.getTipoPago().toLowerCase().equals("c4p")) {
                c4p.addCreditoCuatroPagos(i);
            }
            if (m.getTipoPago().toLowerCase().equals("cnt")) {
                cnt.addMetodoContado(i);
            }

        }
        return i;
    }

    public MetodoPago getMetodoPago(Residente residente) throws PersistenciaException {
        String s = "SELECT * FROM " + nombreTabla + " "
                + "WHERE idResidente = " + Integer.parseInt(residente.getIdResidente()) + ";";
        //System.out.println(s);
        consulta(s);
        ResultSet rs;
        while ((rs = obtenRenglon()) != null) {
            try {
                MetodoPago m = new MetodoPago(String.valueOf(rs.getInt("idMetodoPago")), new Residente(String.valueOf(rs.getInt("idResidente"))),
                        rs.getString("tipoMetodoPago"));
                return m;
            } catch (SQLException ex) {
                throw new PersistenciaException("No se pudo obtener el Metodo de Pago del residente.", ex);
            }
        }
        return null;
    }

    public void actualizaMetodoPagoResidente(Residente residente, String nuevoMetodo) throws PersistenciaException {
        String s = "SELECT tipoMetodoPago FROM " + nombreTabla + " WHERE idResidente = " + Integer.parseInt(residente.getIdResidente());
        consulta(s);
        ResultSet rs;
        String tipo = "";
        System.out.println("Obteniendo el tipoMetodoPago a ser removido.");
        while ((rs = obtenRenglon()) != null) {
            try {
                tipo = rs.getString("tipoMetodoPago");
            } catch (SQLException ex) {
                throw new PersistenciaException("No se pudo obtener el Metodo de Pago del residente.", ex);
            }
        }
        System.out.println("Tipo Metodo Pago: " + tipo);
        System.out.println("Verificando el tipo de pago a borrar.");
        switch (tipo) {
            case "CNT":
                {
                    cnt.deleteMetodoContadoResidente(residente);
                    agregaNuevoTipoPago(residente, nuevoMetodo);
                    Residentes r = new Residentes("residentes");
                    r.setConexion(c.getConexion());
                    break;
                }
            case "M3P":
                {
                    m3p.deleteMetodoMitad3Pagos(residente);
                    agregaNuevoTipoPago(residente, nuevoMetodo);
                    Residentes r = new Residentes("residentes");
                    r.setConexion(c.getConexion());
                    break;
                }
            case "4PI":
                {
                    c4p.deleteMetodo4PagosResidente(residente);
                    agregaNuevoTipoPago(residente, nuevoMetodo);
                    Residentes r = new Residentes("residentes");
                    r.setConexion(c.getConexion());
                    break;
                }
        }
        System.out.println("Actualizando el tipoMetodoPago del residente.");
        String s3 = "UPDATE " + nombreTabla + " SET tipoMetodoPago = '" + nuevoMetodo + "' "
                + "WHERE idResidente = " + Integer.parseInt(residente.getIdResidente()) + ";";
        System.out.println(s3);
        actualiza(s3);
    }

    private void agregaNuevoTipoPago(Residente residente, String nuevoTipo) throws PersistenciaException {
        if (nuevoTipo.equals("CNT")) {
            String s2 = "INSERT INTO contado (idMetodoPago) VALUES(" + residente.getMetodo().getIdMetodoPago() + ");";
            actualiza(s2);
        } else if (nuevoTipo.equals("M3P")) {
            String s2 = "INSERT INTO mitad3Pagos (idMetodoPago) VALUES(" + residente.getMetodo().getIdMetodoPago() + ");";
            actualiza(s2);
        } else if (nuevoTipo.equals("4PI")) {
            String s2 = "INSERT INTO cuatropagosiguales (idMetodoPago) VALUES(" + residente.getMetodo().getIdMetodoPago() + ");";
            actualiza(s2);
        }
    }
    
    public void deleteMetodoPagoResidente(Residente residente) throws PersistenciaException {
        String s = "SELECT tipoMetodoPago FROM " + nombreTabla + " WHERE idResidente = " + Integer.parseInt(residente.getIdResidente());
        consulta(s);
        ResultSet rs;
        String tipo = "";
        while ((rs = obtenRenglon()) != null) {
            try {
                tipo = rs.getString("tipoMetodoPago");
            } catch (SQLException ex) {
                throw new PersistenciaException("No se pudo obtener el Metodo de Pago del residente.", ex);
            }
        }
        //System.out.println("Tipo Metodo Pago: " + tipo);
        //System.out.println("Verificando el tipo de pago a borrar.");
        switch (tipo) {
            case "CNT":
                {
                    cnt.deleteMetodoContadoResidente(residente);
                }
            case "M3P":
                {
                    m3p.deleteMetodoMitad3Pagos(residente);
                    break;
                }
            case "4PI":
                {
                    c4p.deleteMetodo4PagosResidente(residente);
                    break;
                }
        }
        //System.out.println("Actualizando el tipoMetodoPago del residente.");
        String s3 = "DELETE FROM " + nombreTabla + " WHERE idResidente = " + Integer.parseInt(residente.getIdResidente());
        System.out.println(s3);
        actualiza(s3);
    }
    
}